package br.unifor.ads.desphouse.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import br.unifor.ads.desphouse.entity.LancamentoTipo;
import br.unifor.ads.desphouse.to.LancamentoTipoTO;

/**
 * 
 * @author Alex Girao
 */
public class LancamentoTipoDAO {

	private EntityManager em = new EntityManager() {
		@Override
		public Object trataResultSet(ResultSet resultSet) throws SQLException {
			LancamentoTipo tipo = new LancamentoTipo();
			tipo.setCodigo(resultSet.getLong("codigo"));
			tipo.setDescricao(resultSet.getString("descricao"));
			return tipo;
		}
	};
	
	public LancamentoTipo salvar(LancamentoTipo lancamentoTipo) throws SQLException {
		String sql = "insert into financeiro.lancamento_tipo "
				+ "(descricao) "
				+ "values "
				+ "(?) "
				+ "returning codigo, descricao";
		return (LancamentoTipo) em.getSingleResult(sql, lancamentoTipo.getDescricao());
	}

	public void atualizar(LancamentoTipo lancamentoTipo) throws SQLException {
		String sql = "update financeiro.lancamento_tipo set descricao = ? where codigo = ?";
		em.executeQuery(sql, lancamentoTipo.getDescricao(),lancamentoTipo.getCodigo());
	}

	public void excluirPorCodigo(Long codigo) throws SQLException {
		String sql = "delete from financeiro.lancamento_tipo where codigo = ?";
		em.executeQuery(sql, codigo);
	}

	public void excluirTodos() throws SQLException {
		String sql = "delete from financeiro.lancamento_tipo";
		em.executeQuery(sql);
	}

	public LancamentoTipo buscarPorCodigo(Long codigo) throws SQLException {
		String sql = "select codigo, descricao from financeiro.lancamento_tipo where codigo = ?";
		return (LancamentoTipo) em.getSingleResult(sql, codigo);
	}
	
	public LancamentoTipo buscarPorDescricao(String descricao) throws SQLException {
		String sql = "select codigo, descricao from financeiro.lancamento_tipo where descricao ilike ?";
		return (LancamentoTipo) em.getSingleResult(sql, descricao);
	}

	@SuppressWarnings("unchecked")
	public List<LancamentoTipo> buscarTodos() throws SQLException {
		String sql = "select codigo, descricao from financeiro.lancamento_tipo";
		return (List<LancamentoTipo>) em.getResultList(sql);
	}

	//TODO criar teste
	@SuppressWarnings("unchecked")
	public List<LancamentoTipo> buscarPorFiltro(LancamentoTipoTO to) throws SQLException{
		String sql = "select codigo, descricao from financeiro.lancamento_tipo where 1=1 ";
		if(to.getDescricao()!=null && to.getDescricao().trim().length()>0){
			sql += "AND descricao ilike ?";
			return (List<LancamentoTipo>) em.getResultList(sql,"%"+to.getDescricao()+"%");
		}
		return (List<LancamentoTipo>) em.getResultList(sql);
	}

}
